<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

<script>
// Person 为 Teacher 和 Student 的父类/基类
// 注：其本质 还是 函数
function Person(name, height, weight) {
  this.name = name;
  this.height = height;
  this.weight = weight;
}

Person.prototype.sayHi = function() {
  console.log(`你好，我叫~${this.name}`);
}


function Teacher(major, name, height, weight) {
  // 注：调用继承 建议 放 构造函数体内的 第一行
    // 原因：为了 多态的实现
  Person.call(this, name, height, weight); // 即做到了， 构造函数体中 this.xx = xx; 这些代码的 「复用」
  this.major = major;
  this.name = '佚名'; // 模拟实现「多态」
  // this.name = name;
  // this.height = height;
  // this.weight = weight;
}


function Student(level, name, height, weight) {
  Person.call(this, name, height, weight); // 即做到了， 构造函数体中 this.xx = xx; 这些代码的 「复用」
  this.level = level;
  // this.name = name;
  // this.height = height;
  // this.weight = weight;
}

// 原型继承的缺点：无法实现 构造函数 内部 this.xx = xx; 这些代码的 「复用」 - DRY
  // 为了解决 原型继承的缺点，出现了 「借用继承」

const laoWang = new Teacher('医学', '老王', '169cm', '66kg');
const liShiShi = new Student('9年级', '李师师', '169cm', '66kg');


// 总结：借用继承，作用： 让 子类 能 借用/继承  父类的  实例属性（在构造函数体内）
  // 缺点：无法继承 父类 原型对象上的 实例方法
</script>